import axios from "axios";
import qs from "qs";
// npm install axios -y
// npm install qs  -y
import { ElMessage } from "element-plus";
import { useStore } from "@/store/index.js";
import router from "@/router/index.js";
import LocalStoreUtil from "@/utils/LocalStoreUtil.js";

const service = axios.create({
  baseURL: import.meta.env.VITE_BASE_URL,
  timeout: 8000,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  },
  responseType: 'json',
  responseEncoding: 'utf-8'
})

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 在请求中添加时间戳参数，避免浏览器缓存 Get 请求
    if (config.method?.toUpperCase() === 'GET') {
      config.params = {
        ...config.params,
        t: new Date().getTime()
      }
    }

    // 当请求的请求头中包含 application/x-www-form-urlencoded 时（也就是 POST 提交表单），将 POST 请求携带的 json 数据，转换为 key=value&key=value 形式
    // 因为 POST 表单提交请求，通常不使用 json 格式来携带参数，服务器可能会无法解析参数
    if (Object.values(config.headers).includes('application/x-www-form-urlencoded')) {
      config.data = qs.stringify(config.data);
    }

    // 向请求头中添加登录token
    if (LocalStoreUtil.isLogin()) {
      config.headers['Authorization'] = LocalStoreUtil.getToken();
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    if (response.status === 200) {
      // 当响应未授权时清除本地缓存中的用户授权信息
      if (response.data.code === '401') {
        ElMessage.error('登录凭证已过期');

        // 重置当前用户的缓存信息
        const store = useStore();
        LocalStoreUtil.clearToken();
        LocalStoreUtil.clearUserInfo();
        LocalStoreUtil.clearCollectList()
        store.user.method.resetData();
        store.collection.collectionList = [];

        // 重定向到登录页
        router.replace('/login').then(r => {});
      } else if (response.data.code !== '200') {
        // todo 全局显示错误内容
        ElMessage.error(response.data.message);
      }
      return response.data;
    } else {
      // 响应异常时，全局显示错误内容
      ElMessage.error(response.data.message);
      return Promise.reject(response);
    }

  },
  error => {
    ElMessage.error(error.message);
    return Promise.reject(error);
  }
)

export default service;